/*
  ******************************************************************************
  * @file    apt32f172_initial.c
  * @author  APT AE Team
  * @version V1.12
  * @date    2019/03/08
  ******************************************************************************
  *THIS SOFTWARE WHICH IS FOR ILLUSTRATIVE PURPOSES ONLY WHICH PROVIDES 
  *CUSTOMER WITH CODING INFORMATION REGARDING THEIR PRODUCTS.
  *APT CHIP SHALL NOT BE HELD RESPONSIBILITY ADN LIABILITY FOR ANY DIRECT, 
  *INDIRECT DAMAGES WITH RESPECT TO ANY CLAIMS ARISING FROM THE CONTENT OF 
  *SUCH SOFTWARE AND/OR THE USE MADE BY CUSTOMERS OF THE CODING INFORMATION 
  *CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS.AND APT CHIP RESERVES 
  *THE RIGHT TO MAKE CHANGES IN THE SOFTWARE WITHOUT NOTIFICATION
  ******************************************************************************
  */

/* Define to prevent recursive inclusion -------------------------------------*/ 
#include "apt32f172.h"
#include "apt32f172_types_local.h"
#include "apt32f172_coret.h"
#include "apt32f172_ifc.h"
#include "apt32f172_syscon.h"
#include "apt32f172_adc.h"
#include "apt32f172_cmp.h"
#include "apt32f172_oamp.h"
#include "apt32f172_gpio.h"
#include "apt32f172_tc0_gpt.h"
#include "apt32f172_tc1_gtc.h"
#include "apt32f172_tc2_st16.h"
#include "apt32f172_tc3_ctc.h"
#include "apt32f172_epwm.h"
#include "apt32f172_led.h"
#include "apt32f172_i2c.h"
#include "apt32f172_spi.h"
#include "apt32f172_usart.h"
#include "apt32f172_uart.h"
/* define --------------------------------------------------------------------*/

/* externs--------------------------------------------------------------------*/

/*************************************************************/
//software delay
//EntryParameter:NONE
//ReturnValue:NONE
/*************************************************************/	
void delay_nms(unsigned int t)
{
    volatile unsigned int i,j ,k=0;
    j = 50* t;
    for ( i = 0; i < j; i++ )
    {
        k++;
    }
}
/*************************************************************/
//GPIO Functions
//EntryParameter:NONE
//ReturnValue:NONE
/*************************************************************/ 
void GPIO_CONFIG(void)
{
	GPIO_Init(GPIOA0,12,0);							//PA0.12 输出模式
	
	GPIO_Write_High(GPIOA0,12);						//PA0.12 输出高	
//------------  EXI FUNTION  --------------------------------/
//EXI0_INT= EXI0,EXI1_INT= EXI1, EXI2_INT=EXI2~EXI3, EXI3_INT=EXI4~EXI9, EXI4_INT=EXI10~EXI15    
	GPIO_Init(GPIOA0,0,1);							//PA0.00 输入模式, 下面配置为下降沿外部中断方式
						
	GPIO_IntGroup_Set(PA0);							//外部中断选GPIOA0组
	
	EXTI_trigger_CMD(ENABLE,EXI_PIN0,_EXIFT);       //PA0.0下降沿中断
	EXTI_interrupt_CMD(ENABLE,EXI_PIN0);            //使能EXI0中断
	
	GPIO_EXTI_interrupt(GPIOA0,EXI_PIN0);			//使能PA0.0做外部中断
	
	EXI0_Int_Enable();                              //使能EXI0中断向量
	EXI0_WakeUp_Enable();							//使能EXI0中断唤醒
}
/*************************************************************/
//CORET Functions
//EntryParameter:NONE
//ReturnValue:NONE
/*************************************************************/ 
void CORET_CONFIG(void)
{
	CORET_DeInit();									//Coret 所有寄存器复位赋值			
	SYSCON_General_CMD(ENABLE,ENDIS_SYSTICK);		//使能 STCLK 时钟
	CK801->CORET_RVR=0x26259f;						//CORETCLK=sysclock/8=20M/8=0.4us  e.g:1s=(CORET_RVR+1)*0.4us;CORET_RVR=0x2625a0-1=0x26259f
	CORET_reload();									// Coret CVR 清除						
	CORET_CLKSOURCE_EX();							//使用时钟源为sysclk/8
	CORET_TICKINT_Enable();							//使能计数器清零中断
	
	CORET_start();									//Coret 计时开始				
	CORET_Int_Enable();								//使能计数器清零中断向量
	//CORET_WakeUp_Enable();							//使能计数器清零中断唤醒
	
}
/*************************************************************/
//LED Init
//EntryParameter:NONE
//ReturnValue:NONE
/*************************************************************/  
void LED_CONFIG(void)  
{
	LED_RESET_VALUE();                                          //LED 所有寄存器复位赋值
	LED_seg_io_initial(LED_SEG_0,0);							//led seg0 io 初始化
	LED_seg_io_initial(LED_SEG_1,0);							//led seg1 io 初始化
	LED_seg_io_initial(LED_SEG_4,0);							//led seg4 io 初始化
	LED_seg_io_initial(LED_SEG_5,0);							//led seg5 io 初始化
	LED_seg_io_initial(LED_SEG_6,0);							//led seg6 io 初始化
	LED_seg_io_initial(LED_SEG_7,0);							//led seg7 io 初始化
	LED_Control_Config(LEDCLK_DIV32,0xff,LED_Bright_100,80,1);	//F_LedClk=32/20M;COM0~COM7使能;亮度100%;COM显示周期长度=(8*32/20M)*(80+7)=1.1MS;相邻COM互不交叠区时间时间=0;
	LED_SEGDATX_data_write(SEGDAT_NUM0 , 0xaa);                 //SegDat0=0xaa
	LED_SEGDATX_data_write(SEGDAT_NUM1 , 0xbb);                 //SegDat1=0xbb
	LED_SEGDATX_data_write(SEGDAT_NUM2 , 0xcc);                 //SegDat2=0xcc
	LED_SEGDATX_data_write(SEGDAT_NUM3 , 0xdd);                 //SegDat3=0xdd
	LED_SEGDATX_data_write(SEGDAT_NUM4 , 0xee);                 //SegDat4=0xee
	LED_SEGDATX_data_write(SEGDAT_NUM5 , 0xff);                 //SegDat5=0xff
	LED_SEGDATX_data_write(SEGDAT_NUM6 , 0x99);                 //SegDat6=0x99
	LED_SEGDATX_data_write(SEGDAT_NUM7 , 0x88);                 //SegDat7=0x88
	LED_SCAN_ENABLE(ENABLE);                                    //LED Scan enable	

	//LED_INT_CMD(IPEND,ENABLE);									//LED 一个com扫描结束中断使能
	//LED_INT_CMD(ICEND,ENABLE);									//LED 所有com扫描结束中断使能

	//LED_Int_Enable();											//LED INT Vector Enable			
										
}
/*************************************************************/
//ADC Functions
//EntryParameter:NONE
//ReturnValue:NONE
/*************************************************************/ 
void ADC_CONFIG(void)
{
	ADC12_RESET_VALUE();																//ADC 所有寄存器复位赋值
    ADC12_CLK_CMD(ADC_CLK_CR , ENABLE);                                                 //使能 ADC CLK
    ADC12_Software_Reset();                                                             //ADC 软件复位
	ADC12_Configure_Mode(ADC12_12BIT , One_shot_mode ,0, 2 , 2);        				//选择12BIT ADC; 单次模式; 转换优先序列寄存器为0; ADC_CLK=PCLK/2*2=0.2us; 转换序列个数为2
	//ADC12_Configure_VREF_VDD();															//使用VDD为参考电压
	ADC12_Configure_VREF_FVR(ADC12_FVR_2_048V);											//使用内部为参考电压2.048mV
	//ADC12_Configure_VREF_EX();															//使用外部Vref为参考电压
	ADC12_ConversionChannel_Config(ADC12_ADCIN10,ADC12_3CYCLES,ADC12_CV_RepeatNum1,ADC12_AVGDIS,0);//转换序列0,选择ADCIN10通道, 3个转换周期, 连续重复采样次数为1,平均值计算禁止
	ADC12_ConversionChannel_Config(ADC12_ADCIN11,ADC12_3CYCLES,ADC12_CV_RepeatNum1,ADC12_AVGDIS,1);//转换序列1,选择ADCIN11通道, 3个转换周期, 连续重复采样次数为1,平均值计算禁止
	ADC12_CMD(ENABLE);                                                                  //使能ADC模块
    ADC12_ready_wait(); 																//等待ADC模块配置完成
	ADC12_Control(ADC12_START);															//启动ADC转换
	 
}
/*************************************************************/
//UART Functions
//EntryParameter:NONE
//ReturnValue:NONE
/*************************************************************/ 
void UART_CONFIG(void)
{
	UART_DeInit();                                                              //UART 所有寄存器复位赋值
    UART_IO_Init(IO_PA1);                                                  		//UART1脚位选择PA1.2->RXD1, PA1.1->TXD1
    UARTInitRxTxIntEn(UART1,173,UART1_PAR_NONE);	                            //使能Uart中断, baudrate=20000000/173=115200, 使能偶校验位
    UART1_Int_Enable();														    //uart1 中断向量使能
    //UART1_WakeUp_Enable();                                                      //uart1 wakeup Enable
	
} 
/*************************************************************/
//USART Functions
//EntryParameter:NONE
//ReturnValue:NONE
/*************************************************************/ 
void USART_CONFIG(void)
{
	USART_DeInit();                                                              	//USART 所有寄存器复位赋值
    USART_CLK_Enable();																//USART CLK	使能
	USART_CTRL_Config(RSTRX,ENABLE);												//复位接收模块
	USART_CTRL_Config(RSTTX,ENABLE);												//复位发射模块
	USART_IO_Init(USART_PB0);                                                  		//USART 使用PB0.0->RXD0, PB0.1->TXD0
	//USART_CLKIO_Init(CLK_PA02);													//同步模式下可以选择PA0.2作为UARTCLK
    USART_MODE_Config(SENDTIME0,PCLK,CHRL8,ASYNC,PAR_EVEN,NBSTOP1,CHMODE_NORMAL);	//重发次数为0, CLKs=PCLK, 字节长度8bit, 异步模式, 偶校验位, 1个停止位, 普通模式
	//USART_CLKO_Config(ENABLE);														//同步模式下需要输出UARTCLK时,需要使能
    USART_Baudrate_Cal(115200,20000000,PCLK,ASYNC);									//波特率=38400, 主频选择20M, PCLK不分频, 异步模式							
	USART_CTRL_Config(TXEN,ENABLE);													//USART 发送使能
	USART_CTRL_Config(RXEN,ENABLE);													//USART 接收使能
	USART_INT_Config(RXRDY_INT,ENABLE);												//USART 接收中断使能
	//USART_INT_Config(TXRDY_INT,ENABLE);												//USART 发射中断使能	
	USART_Int_Enable();																//USART 中断向量使能
	//USART_WakeUp_Enable();															//USART 中断唤醒使能
	
}
/*************************************************************/
//GPT Functions
//EntryParameter:NONE
//ReturnValue:NONE
/*************************************************************/ 
void GPT_CONFIG(void)
{
	GPT_RESET_VALUE(GPTCH0);												//GPT0 所有寄存器复位赋值
	GPT_RESET_VALUE(GPTCH1);												//GPT1 所有寄存器复位赋值
	GPT_RESET_VALUE(GPTCH2);												//GPT2 所有寄存器复位赋值
	
	//GPT_IO_Init(GPT_IO_CLK0,0);												//CLK0 初始化
	//GPT_IO_Init(GPT_IO_CLK1,0);												//CLK1 初始化
	//GPT_IO_Init(GPT_IO_CLK2,0);												//CLK2 初始化	
	//GPT_IO_Init(GPT_IO_ETR,0);												//GPTx 外部触发 初始化					
	//GPT_IO_Init(GPT_IO_IO0A,0);												//IO0A 初始化
	//GPT_IO_Init(GPT_IO_IO0B,0);												//IO0B 初始化		
	//GPT_IO_Init(GPT_IO_IO1A,0);												//IO1A 初始化
	//GPT_IO_Init(GPT_IO_IO1B,0);												//IO1B 初始化
	//GPT_IO_Init(GPT_IO_IO2A,0);												//IO2A 初始化
	//GPT_IO_Init(GPT_IO_IO2B,0);												//IO2B 初始化	
	
	GPTCHX_Clk_CMD(GPTCH0,ENABLE);											//GPT0 时钟使能	
	GPTCHX_Clk_CMD(GPTCH1,ENABLE);											//GPT1 时钟使能
	GPTCHX_Clk_CMD(GPTCH2,ENABLE);											//GPT2 时钟使能
	
	GPTCHX_SoftwareReset(GPTCH0);											//GPT0 软件复位
	GPTCHX_SoftwareReset(GPTCH1);											//GPT1 软件复位
	GPTCHX_SoftwareReset(GPTCH2);											//GPT2 软件复位
	
	//-------------外部时钟XC0~XC2源输入口选择-------------------
	//GPTCHX_XCn_Configure(XC0_Configure,XC0_Selecte_TCLK0);					//XC0 选择 TCLK0
	//GPTCHX_XCn_Configure(XC1_Configure,XC1_Selecte_TCLK1);					//XC1 选择 TCLK1
	//GPTCHX_XCn_Configure(XC2_Configure,XC2_Selecte_TCLK2);					//XC2 选择 TCLK2
	
	GPTCHX_CLK_Configure(GPTCH0,GPT_Mclk_Selecte_Pclk,GptClks_MCLK_DIV1,GPTCHX_CLKI_0,GPTCHX_BURST_SET_None);	//GTP0 选择 PCLK 作为 MCLK;CLKS=MCLK/1;CLK上升沿计数;关闭群脉冲模式
	GPTCHX_CLK_Configure(GPTCH1,GPT_Mclk_Selecte_Pclk,GptClks_MCLK_DIV1,GPTCHX_CLKI_0,GPTCHX_BURST_SET_None);	//GTP1 选择 PCLK 作为 MCLK;CLKS=MCLK/1;CLK上升沿计数;关闭群脉冲模式
	GPTCHX_CLK_Configure(GPTCH2,GPT_Mclk_Selecte_Pclk,GptClks_MCLK_DIV1,GPTCHX_CLKI_0,GPTCHX_BURST_SET_None);	//GTP2 选择 PCLK 作为 MCLK;CLKS=MCLK/1;CLK上升沿计数;关闭群脉冲模式
	
	//------------RC匹配定时模块-------------------------
	GPTCHX_COUNT_Configure(GPTCH0,CPC_Reload_ENABLE);						//GPT0 RC匹配重新计数
	GPTCHX_COUNT_Configure(GPTCH1,CPC_Reload_ENABLE);						//GPT1 RC匹配重新计数
	GPTCHX_COUNT_Configure(GPTCH2,CPC_Reload_ENABLE);						//GPT2 RC匹配重新计数
	
	//-----------RA&RB PWM|定时 模块--------------------
	//GPTCHX_PWM_Configure(GPTCH0,CPC_STOP_DISABLE,CPC_DisCountClk_DISABLE,CPC_Reload_ENABLE,EEVT_Reload_DISABLE,EEVT_XC0_NONE,
	//					TIOA_SWTRG_OutPut_High,TIOA_EEVT_OutPut_NoChange,TIOA_CPA_OutPut_Low,TIOA_CPC_OutPut_High,TIOB_SWTRG_OutPut_High,TIOB_EEVT_OutPut_NoChange,TIOB_CPB_OutPut_Low,TIOB_CPC_OutPut_High);
	//GPT0RC匹配停止计数禁止;RC匹配停止计数时钟禁止;RC匹配重新计数禁止;外部事件触发重新计数禁止;外部事件XC0选择禁止;软件触发TIOA为高电平;外部事件触发TIOA不改变;RA匹配TIOA输出低电平;RC匹配TIOA输出高;软件触发TIOB为高电平;外部事件触发TIOB不改变;RB匹配TIOB输出低电平;RC匹配TIOB输出高
	//GPTCHX_PWM_Configure(GPTCH1,CPC_STOP_DISABLE,CPC_DisCountClk_DISABLE,CPC_Reload_ENABLE,EEVT_Reload_DISABLE,EEVT_XC0_NONE,
	//					TIOA_SWTRG_OutPut_High,TIOA_EEVT_OutPut_NoChange,TIOA_CPA_OutPut_Low,TIOA_CPC_OutPut_High,TIOB_SWTRG_OutPut_High,TIOB_EEVT_OutPut_NoChange,TIOB_CPB_OutPut_Low,TIOB_CPC_OutPut_High);
	//GPT1,RC匹配停止计数禁止;RC匹配停止计数时钟禁止;RC匹配重新计数禁止;外部事件触发重新计数禁止;外部事件XC0选择禁止;软件触发TIOA为高电平;外部事件触发TIOA不改变;RA匹配TIOA输出低电平;RC匹配TIOA输出高;软件触发TIOB为高电平;外部事件触发TIOB不改变;RB匹配TIOB输出低电平;RC匹配TIOB输出高
	//GPTCHX_PWM_Configure(GPTCH2,CPC_STOP_DISABLE,CPC_DisCountClk_DISABLE,CPC_Reload_ENABLE,EEVT_Reload_DISABLE,EEVT_XC0_NONE,
	//					TIOA_SWTRG_OutPut_High,TIOA_EEVT_OutPut_NoChange,TIOA_CPA_OutPut_Low,TIOA_CPC_OutPut_High,TIOB_SWTRG_OutPut_High,TIOB_EEVT_OutPut_NoChange,TIOB_CPB_OutPut_Low,TIOB_CPC_OutPut_High);
	//GPT2,RC匹配停止计数禁止;RC匹配停止计数时钟禁止;RC匹配重新计数禁止;外部事件触发重新计数禁止;外部事件XC0选择禁止;软件触发TIOA为高电平;外部事件间触发TIOA不改变;RA匹配TIOA输出低电平;RC匹配TIOA输出高;软件触发TIOB为高电平;外部事件触发TIOB不改变;RB匹配TIOB输出低电平;RC匹配TIOB输出高
	GPTCHX_Set_RA_RB_RC(GPTCH0,0,0,1000);				//GPT0 RA=0,RB=0,RC=1000
	GPTCHX_Set_RA_RB_RC(GPTCH1,0,0,1000);				//GPT1 RA=0,RB=0,RC=1000
	GPTCHX_Set_RA_RB_RC(GPTCH2,0,0,1000);				//GPT2 RA=0,RB=0,RC=1000
	
	//--------------RA RB 匹配捕捉 模块------------------
	//GPTCHX_Capture_Configure(GPTCH0,LDB_STOP_ENABLE,LDB_DisCountClk_DISABLE,ABETRG_TIOA_Rise,CPC_Reload_DISABLE,LDRA_TIOA_Fall,LDRB_TIOA_Rise);
	//GPT0;RB载入停止计数使能;RB载入停止时钟禁止;TIOA上升沿触发重启计数;RC匹配重新计数禁止;RA在TIOA下降沿载入;RB在TIOA上升沿载入
	//GPTCHX_Capture_Configure(GPTCH1,LDB_STOP_ENABLE,LDB_DisCountClk_DISABLE,ABETRG_TIOA_Rise,CPC_Reload_DISABLE,LDRA_TIOA_Fall,LDRB_TIOA_Rise);
	//GPT1;RB载入停止计数使能;RB载入停止时钟禁止;TIOA上升沿触发重启计数;RC匹配重新计数禁止;RA在TIOA下降沿载入;RB在TIOA上升沿载入
	//GPTCHX_Capture_Configure(GPTCH2,LDB_STOP_ENABLE,LDB_DisCountClk_DISABLE,ABETRG_TIOA_Rise,CPC_Reload_DISABLE,LDRA_TIOA_Fall,LDRB_TIOA_Rise);
	//GPT2;RB载入停止计数使能;RB载入停止时钟禁止;TIOA上升沿触发重启计数;RC匹配重新计数禁止;RA在TIOA下降沿载入;RB在TIOA上升沿载入
	
	//GPTCHX_ConfigInterrupt_CMD(GPTCH0,GPTCHX_INT_COVFS,ENABLE);			//使能 GPT0计数溢出中断
	//GPTCHX_ConfigInterrupt_CMD(GPTCH0,GPTCHX_INT_LOVRS,ENABLE);			//使能 GPT0载入溢出中断
	//GPTCHX_ConfigInterrupt_CMD(GPTCH0,GPTCHX_INT_CPAS,ENABLE);			//使能 GPT0比较寄存器A匹配中断
	//GPTCHX_ConfigInterrupt_CMD(GPTCH0,GPTCHX_INT_CPBS,ENABLE);			//使能 GPT0比较寄存器B匹配中断
	GPTCHX_ConfigInterrupt_CMD(GPTCH0,GPTCHX_INT_CPCS,ENABLE);			//使能 GPT0比较寄存器C匹配中断
	//GPTCHX_ConfigInterrupt_CMD(GPTCH0,GPTCHX_INT_LDRAS,ENABLE);			//使能 GPT0载入寄存器A中断
	//GPTCHX_ConfigInterrupt_CMD(GPTCH0,GPTCHX_INT_LDRBS,ENABLE);			//使能 GPT0载入寄存器B中断
	//GPTCHX_ConfigInterrupt_CMD(GPTCH0,GPTCHX_INT_ETRGS,ENABLE);			//使能 GPT0外部触发中断
	
	//GPTCHX_ConfigInterrupt_CMD(GPTCH1,GPTCHX_INT_COVFS,ENABLE);			//使能 GPT1计数溢出中断
	//GPTCHX_ConfigInterrupt_CMD(GPTCH1,GPTCHX_INT_LOVRS,ENABLE);			//使能 GPT1载入溢出中断
	//GPTCHX_ConfigInterrupt_CMD(GPTCH1,GPTCHX_INT_CPAS,ENABLE);			//使能 GPT1比较寄存器A匹配中断
	//GPTCHX_ConfigInterrupt_CMD(GPTCH1,GPTCHX_INT_CPBS,ENABLE);			//使能 GPT1比较寄存器B匹配中断
	GPTCHX_ConfigInterrupt_CMD(GPTCH1,GPTCHX_INT_CPCS,ENABLE);			//使能 GPT1比较寄存器C匹配中断
	//GPTCHX_ConfigInterrupt_CMD(GPTCH1,GPTCHX_INT_LDRAS,ENABLE);			//使能 GPT1载入寄存器A中断
	//GPTCHX_ConfigInterrupt_CMD(GPTCH1,GPTCHX_INT_LDRBS,ENABLE);			//使能 GPT1载入寄存器B中断
	//GPTCHX_ConfigInterrupt_CMD(GPTCH1,GPTCHX_INT_ETRGS,ENABLE);			//使能 GPT1外部触发中断	
	
	//GPTCHX_ConfigInterrupt_CMD(GPTCH2,GPTCHX_INT_COVFS,ENABLE);			//使能 GPT2计数溢出中断	
	//GPTCHX_ConfigInterrupt_CMD(GPTCH2,GPTCHX_INT_LOVRS,ENABLE);			//使能 GPT2载入溢出中断
	//GPTCHX_ConfigInterrupt_CMD(GPTCH2,GPTCHX_INT_CPAS,ENABLE);			//使能 GPT2比较寄存器A匹配中断
	//GPTCHX_ConfigInterrupt_CMD(GPTCH2,GPTCHX_INT_CPBS,ENABLE);			//使能 GPT2比较寄存器B匹配中断
	GPTCHX_ConfigInterrupt_CMD(GPTCH2,GPTCHX_INT_CPCS,ENABLE);			//使能 GPT2比较寄存器C匹配中断
	//GPTCHX_ConfigInterrupt_CMD(GPTCH2,GPTCHX_INT_LDRAS,ENABLE);			//使能 GPT2载入寄存器A中断
	//GPTCHX_ConfigInterrupt_CMD(GPTCH2,GPTCHX_INT_LDRBS,ENABLE);			//使能 GPT2载入寄存器B中断
	//GPTCHX_ConfigInterrupt_CMD(GPTCH2,GPTCHX_INT_ETRGS,ENABLE);			//使能 GPT2外部触发中断
	
	//---------------------GPT 开启-----------------------
	GPTCHX_CountClk_CMD(GPTCH0,ENABLE);									//使能 GPT0 计数时钟
	GPTCHX_CountClk_CMD(GPTCH1,ENABLE);									//使能 GPT1 计数时钟
	GPTCHX_CountClk_CMD(GPTCH2,ENABLE);									//使能 GPT2 计数时钟
	//All_GPT_SWTRG();													//GPT0、GPT1、GPT2同时触发
	GPTCHX_SWTRG(GPTCH0);												//软件触发GPT0  
	GPTCHX_SWTRG(GPTCH1);												//软件触发GPT1  
	GPTCHX_SWTRG(GPTCH2);												//软件触发GPT2  
	
	GPTCH0_Int_Enable();												//使能 GPT0 中断向量
	GPTCH1_Int_Enable();												//使能 GPT1 中断向量
	GPTCH2_Int_Enable();												//使能 GPT2 中断向量
	
}
/*************************************************************/
//gtc Functions
//EntryParameter:NONE
//ReturnValue:NONE
/*************************************************************/ 
void GTC_CONFIG(void)
{
    GTC_RESET_VALUE();                                                        	//GTC 所有寄存器复位赋值
	GTC_SoftwareReset();														//GTC 软件复位
    //GTC_IO_Init(GTC_IO_TXOUT , 0 );                                           //PWM输出初始化
    GTC_Configure(GTC_FIN_PCLK , 1 , 9 , Counter_Size_32BIT  , 100000 , 0);  		//TCCLK=sysclock/2^1/10，GTC_Clk-->1us
    GTC_ControlSet_Configure(GTC_ControlSet_REPEAT,ENABLE);                  	//使能循环重复模式
    //GTC_ControlSet_Configure(GTC_ControlSet_PWMEN,ENABLE);                   		//使能PWM模式
    //GTC_ControlSet_Configure(GTC_ControlSet_IDLEST,ENABLE);                  		//Idle状态下输出高电平
	//GTC_ControlSet_Configure(GTC_ControlSet_OUTST,ENABLE);                   		//计数开始时输出高电平
    //GTC_ControlSet_Configure(GTC_ControlSet_CAPT_F,ENABLE);                		//下降沿捕捉使能
    //GTC_ControlSet_Configure(GTC_ControlSet_CAPT_TCAP,ENABLE);            		//捕捉输入使能
    //GTC_ConfigInterrupt_CMD(GTC_STARTI, ENABLE);                         			//start中断使能
    //GTC_ConfigInterrupt_CMD(GTC_STOPI, ENABLE);                          			//stop中断使能
    GTC_ConfigInterrupt_CMD(GTC_PSTARTI, ENABLE);                          		//周期start中断使能
    //GTC_ConfigInterrupt_CMD(GTC_PENDI, ENABLE);                          			//周期stop中断使能
    //GTC_ConfigInterrupt_CMD(GTC_MATI, ENABLE);                           			//脉冲匹配中断使能
    //GTC_ConfigInterrupt_CMD(GTC_OVFI, ENABLE);                           			//溢出中断使能
    //GTC_ConfigInterrupt_CMD(GTC_CAPTI, ENABLE);                          			//捕捉中断使能
    GTC_Start();                                                              	//start GTC
    GTC_Int_Enable();                                                           //使能GTC中断向量
	
}
/*************************************************************/
//stc16 Functions
//EntryParameter:NONE
//ReturnValue:NONE
/*************************************************************/ 
void STC16_CONFIG(void)
{
	STC16_RESET_VALUE();														//STC16 所有寄存器复位赋值
	STC16_Softreset();															//STC16 软件复位
	
	//STC16_IO_Init(STC16_IO_CAP0,0);												//STC16 CAP0 初始化
	//STC16_IO_Init(STC16_IO_CAP1,0);												//STC16 CAP1 初始化
	
	STC16_Clk_CMD(ENABLE);														//STC16 时钟使能
	
	//STC16_Channel0_CMD(ENABLE);													//STC16 通道0使能
	//STC16_Channel1_CMD(ENABLE);													//STC16 通道1使能
	
	STC16_Configure(STC16_Count_mode_Continue,STC16_Count_STOPTYPE_StopConmand,STC16_CM0_Mode_Capture,STC16_CM1_Mode_Match,19,0);
	//STC16 Configure;设置为连续计数模式;单次计数模式下,选择立即停止模式;通道0作为捕捉模式;通道1作为匹配模式;stc16_timeclk=pclk/(19+1)/2^0=1us
	//STC16_Channel0_Capture_LoadMode_set(STC16_C0SR_CaptureFall);					//stc16 Channel0下降沿捕捉
	STC16_CNR_CC0_CC1_Load(10000,0,0);												//STC16 CNTR=50,CC0R=0,CC1R=0
	
	
	//STC16_MINT_CMD(ST16_STARTI,ENABLE);											//STC16 STARTI中断使能
	//STC16_MINT_CMD(ST16_STOPI,ENABLE);											//STC16 STOP中断使能
	STC16_MINT_CMD(ST16_PENDI,ENABLE);											//STC16 周期结束中断使能	
	//STC16_CINT_CMD(ST16_CC0RI,ENABLE);											//STC16 通道0上升沿中断使能
	//STC16_CINT_CMD(ST16_CC0FI,ENABLE);											//STC16 通道0下降沿中断使能
	//STC16_CINT_CMD(ST16_CC1RI,ENABLE);											//STC16 通道1上升沿中断使能
	//STC16_CINT_CMD(ST16_CC1FI,ENABLE);											//STC16 通道1下降沿中断使能
	//STC16_CINT_CMD(ST16_Match0,ENABLE);												//STC16 通道0匹配中断
	//STC16_CINT_CMD(ST16_Match1,ENABLE);												//STC16 通道1匹配中断
	
	STC16_Start();																//Start stc16
	STC16_Int_Enable();															//ENABLE STC16 中断向量
	
}
/*************************************************************/
//CTC Functions
//EntryParameter:NONE
//ReturnValue:NONE
/*************************************************************/ 
//计算公式：Trct_ck * (2^32 - TIMDR) 
void CTC_CONFIG(void)
{
	CTC_RESET_VALUE();									//CTC 所有寄存器复位赋值
	CTC_SoftReset();									//CTC 软件复位
	//CTC_IO_Init(0);										//BUZZ io 初始化
	CTC_Clk_CMD(ENABLE);								//使能 CTC_CLK
	CTC_Config(CTC_CLK_Source_set_EMOSC,CTC_BUZZ_Freq_1kHz,CTC_Count_Period_PRDR);		//CTC使用外部晶振振，buzz输出频率为1Khz, 计数周期2s,若计数周期大于2s,周期=PRDR*2S
	CTC->PRDR=0X02;
	CTC_INT_CMD(CTC_INT_PEND,ENABLE);					//使能 CTC PEND 中断
	//CTC_INT_CMD(CTC_INT_OVF,ENABLE);						//使能 CTC OVF 中断
	CTC_Start();										//CTC 开启
	CTC_Int_Enable();									//使能 CTC 中断向量		
	CTC_Wakeup_Enable();								//使能 CTC 唤醒
	
}
/*************************************************************/
//CMP Init
//EntryParameter:NONE
//ReturnValue:NONE
/*************************************************************/  
void CMP_CONFIG(void)
{
	CMP_RESET_VALUE();								//CMP 所有寄存器复位赋值
	CMP_software_reset();							//CMP 软件复位	
	
	CMP_IO_Init(CPINP0,0);							//CPINP0 初始化
	//CMP_IO_Init(CPINP1,0);							//CPINP1 初始化
	//CMP_IO_Init(CPINP2,0);							//CPINP2 初始化	
	//CMP_IO_Init(CPINP3,0);							//CPINP3 初始化	
	//CMP_IO_Init(CPINP4,0);							//CPINP4 初始化
	//CMP_IO_Init(CPINP5,0);							//CPINP5 初始化
	//CMP_IO_Init(CPINP6,0);							//CPINP6 初始化
	//CMP_IO_Init(CPINP7,0);							//CPINP7 初始化
	//CMP_IO_Init(CPINP8,0);							//CPINP8 初始化
	//CMP_IO_Init(CPINP9,0);							//CPINP9 初始化
	
	CMP_IO_Init(CPINN0,0);							//CPINN0 初始化	
	//CMP_IO_Init(CPINN1,0);							//CPINN1 初始化		
	//CMP_IO_Init(CPINN2,0);							//CPINN2 初始化	
	//CMP_IO_Init(CPINN3,0);							//CPINN3 初始化	
	//CMP_IO_Init(CPINN4,0);							//CPINN4 初始化	
	
	CMP_IO_Init(CP0_OUT,0);							//CP0_OUT 初始化	
	//CMP_IO_Init(CP1_OUT,0);							//CP1_OUT 初始化	
	//CMP_IO_Init(CP2_OUT,0);							//CP2_OUT 初始化	
	//CMP_IO_Init(CP3_OUT,0);							//CP3_OUT 初始化	
	//CMP_IO_Init(CP4_OUT,0);							//CP4_OUT 初始化	
	
	CMP_INPCRX_Config(CMP0_NUM,248,0);						//比较器负向:CPINN0  比较器正向:CPINP0
	CMP_CLK_CMD(CMP0_NUM,ENABLE);							//比较器0时钟使能
	CMP_CR_Config(CMP0_NUM,NHYST_0mv,PHYST_0mv,POLARITY_0,EVE_SEL_fall_rise,EN_FLTEN,CPOS_1);
	//使能CMP0比较器，比较器正向和负向迟滞电压为0mV，比较器输出不反向，事件触发为上升沿和下降沿，滤波器使能，选择经过滤波器后输出
	CMPX_FLTCR_Config(CMP0_NUM,CMPX_CLK_PCLK,4,199);		//FLT_CK = 20M/(199+1)/2^4=160us; 滤波次数固定为3次 160us*3=480us
	CMP_Open(CMP0_NUM);										//比较器0打开
	CMP->ICR =	EDGEDET0;									//清除CMP0中断标志位
	CMP_ConfigInterrupt_CMD(EDGEDET0,ENABLE);				//CMP0 中断使能
	
	//CMP_INPCRX_Config(CMP1_NUM,250,1);						//比较器负向:CPINN2  比较器正向:CPINP1
	//CMP_CLK_CMD(CMP1_NUM,ENABLE);								//比较器1时钟使能
	//CMP_CR_Config(CMP1_NUM,NHYST_0mv,PHYST_0mv,POLARITY_0,EVE_SEL_fall_rise,EN_FLTEN,CPOS_1);
	//使能CMP1比较器，比较器正向和负向迟滞电压为0mV，比较器输出不反向，事件触发为上升沿和下降沿，滤波器使能，选择经过滤波器后输出
	//CMPX_FLTCR_Config(CMP1_NUM,CMPX_CLK_PCLK,4,199);			//FLT_CK = 20M/(199+1)/2^4=160us; 滤波次数固定为3次
	//CMP_Open(CMP1_NUM);										//比较器1打开
	//CMP->ICR = EDGEDET1;										//清除CMP1中断标志位
	//CMP_ConfigInterrupt_CMD(EDGEDET1,ENABLE);					//CMP1 中断使能
	
	//CMP_INPCRX_Config(CMP2_NUM,250,2);						//比较器负向:CPINN2  比较器正向:CPINP2
	//CMP_CLK_CMD(CMP2_NUM,ENABLE);								//比较器2时钟使能
	//CMP_CR_Config(CMP2_NUM,NHYST_0mv,PHYST_0mv,POLARITY_0,EVE_SEL_fall_rise,EN_FLTEN,CPOS_1);
	//使能CMP2比较器，比较器正向和负向迟滞电压为0mV，比较器输出不反向，事件触发为上升沿和下降沿，滤波器使能，选择经过滤波器后输出
	//CMPX_FLTCR_Config(CMP2_NUM,CMPX_CLK_PCLK,4,199);			//FLT_CK = 20M/(199+1)/2^4=160ms; 滤波次数固定为3次
	//CMP_Open(CMP2_NUM);										//比较器2打开
	//CMP->ICR = EDGEDET2;										//清除CMP2中断标志位
	//CMP_ConfigInterrupt_CMD(EDGEDET2,ENABLE);					//CMP2 中断使能
	
	//CMP_INPCRX_Config(CMP3_NUM,251,3);						//比较器负向:CPINN3  比较器正向:CPINP3
	//CMP_CLK_CMD(CMP3_NUM,ENABLE);								//比较器3时钟使能
	//CMP_CR_Config(CMP3_NUM,NHYST_0mv,PHYST_0mv,POLARITY_0,EVE_SEL_fall_rise,EN_FLTEN,CPOS_1);
	//使能CMP3比较器，比较器正向和负向迟滞电压为0mV，比较器输出不反向，事件触发为上升沿和下降沿，滤波器使能，选择经过滤波器后输出
	//CMPX_FLTCR_Config(CMP3_NUM,CMPX_CLK_PCLK,4,199);			//FLT_CK = 20M/(199+1)/2^4=160ms; 滤波次数固定为3次
	//CMP_Open(CMP3_NUM);										//比较器3打开
	//CMP->ICR = EDGEDET3;										//清除CMP3中断标志位
	//CMP_ConfigInterrupt_CMD(EDGEDET3,ENABLE);					//CMP3 中断使能
	
	//CMP_INPCRX_Config(CMP4_NUM,252,4);						//比较器负向:CPINN4  比较器正向:CPINP4
	//CMP_CLK_CMD(CMP4_NUM,ENABLE);								//比较器4时钟使能
	//CMP_CR_Config(CMP4_NUM,NHYST_0mv,PHYST_0mv,POLARITY_0,EVE_SEL_fall_rise,EN_FLTEN,CPOS_1);
	//使能CMP4比较器，比较器正向和负向迟滞电压为0mV，比较器输出不反向，事件触发为上升沿和下降沿，滤波器使能，选择经过滤波器后输出
	//CMPX_FLTCR_Config(CMP4_NUM,CMPX_CLK_PCLK,4,199);			//FLT_CK = 20M/(199+1)/2^4=160ms; 滤波次数固定为3次
	//CMP_Open(CMP4_NUM);										//比较器4打开
	//CMP->ICR = EDGEDET4;										//清除CMP4中断标志位
	//CMP_ConfigInterrupt_CMD(EDGEDET4,ENABLE);					//CMP4 中断使能
	
	CMP0_Int_Enable();										//CMP0~CMP1 中断向量使能
	//CMP1_Int_Enable();										//CMP2~CMP3 中断向量使能
	
}
/*************************************************************/
//OPAMP Init
//EntryParameter:NONE
//ReturnValue:NONE
/*************************************************************/ 
void OPAMP_CONFIG(void)
{
	OPA_RESET_VALUE();										//OPAx 所有寄存器复位赋值
	
	OPA_IO_Init(OPA0P,0);									//OPA0P 初始化				
	//OPA_IO_Init(OPA0N,0);									//OPA0N 初始化				
	OPA_IO_Init(OPA0X,0);									//OPA0X 初始化				
	
	OPA_IO_Init(OPA1P,0);									//OPA1P 初始化		
	//OPA_IO_Init(OPA1N,0);									//OPA1N 初始化		
	OPA_IO_Init(OPA1X,0);									//OPA1X 初始化		
	
	OPA_EN_CMD(OPA0_NUM,ENABLE);							//OPA0  ENABLE
	OPA_EN_CMD(OPA1_NUM,ENABLE);							//OPA1  ENABLE
	
	OPA_Config_Prg(OPA0_NUM,PGAEN_ENABLE,Op_ExtPinConnect_DIS,0,4,0);			//OPA0,使能内部增益控制,负向输入口与PIN脚连通禁止,正向输入口为OPA0P,增益x5,微调增益0
	OPA_Config_Prg(OPA1_NUM,PGAEN_ENABLE,Op_ExtPinConnect_DIS,0,1,0);			//OPA1,使能内部增益控制,负向输入口与PIN脚连通禁止,正向输入口为OPA1P,增益x10,微调增益0
	
}
/*************************************************************/
//EPWM Init
//EntryParameter:NONE
//ReturnValue:NONE
/*************************************************************/  
/**********************BLOCK VIEW*****************************************/
/*                   - PX ---                           -- PWM_X        */
/*      PWM Engine --         ---PWM output Control ---                 */
/*                   -PY ---                            --PWM_Y         */
/*************************************************************************/ 
void EPWM_CONFIG(void)
{
	EPWM_RESET_VALUE();									//EPWM 所有寄存器复位赋值
	EPWM_software_reset();								//EPWM 软件复位	
	
	//EPWM_IO_Init(PWM_X0,0);							//PWM_X0 初始化
	EPWM_IO_Init(PWM_Y0,1);							//PWM_Y0 初始化
	//EPWM_IO_Init(PWM_X1,0);							//PWM_X1 初始化
	//EPWM_IO_Init(PWM_Y1,0);							//PWM_Y1 初始化
	//EPWM_IO_Init(PWM_X2,0);							//PWM_X2 初始化
	//EPWM_IO_Init(PWM_Y2,0);							//PWM_Y2 初始化
	//EPWM_IO_Init(PWM_EP0,0);							//PWM_EP0 初始化
	//EPWM_IO_Init(PWM_EP1,0);							//PWM_EP1 初始化
	//EPWM_IO_Init(PWM_EP2,0);							//PWM_EP2 初始化
	//EPWM_IO_Init(PWM_EP3,0);							//PWM_EP3 初始化
	//EPWM_IO_Init(PWM_EP4,0);							//PWM_EP4 初始化
		
	EPWM_CONTER_Configure(EPWM_ContMode_decrease,EPWM_Conter_three,EMP_Overflow_Mode_Continue,0,1);		//递减计数, EPMW_CLK=PCLK/(2^DIVN)/(DINM+1)=20M/2/(9+1)=1M=1US, 单次触发
	
	//EPWM_PX_PY_Configure(EPWM_P0X,EPWM_StartStopEvent_OutHigh,EPWM_PendEvent_OutHigh,EPWM_CentralEvent_NoChange,EPWM_EqCMPAEvent_OutLow,EPWM_EqCMPBEvent_NoChange,1000,500,0);	//P0X CNTR=1000,CMPAR=500,CMPBR=0
	EPWM_PX_PY_Configure(EPWM_P0Y,EPWM_StartStopEvent_OutLow,EPWM_PendEvent_OutLow,EPWM_CentralEvent_NoChange,EPWM_EqCMPAEvent_OutHigh,EPWM_EqCMPBEvent_NoChange,1000,500,0);		//P0Y CNTR=1000,CMPAR=500,CMPBR=0
	//EPWM_PX_PY_Configure(EPWM_P1X,EPWM_StartStopEvent_OutHigh,EPWM_PendEvent_OutHigh,EPWM_CentralEvent_NoChange,EPWM_EqCMPAEvent_OutLow,EPWM_EqCMPBEvent_NoChange,1000,500,0);	//P1X CNTR=1000,CMPAR=500,CMPBR=0
	//EPWM_PX_PY_Configure(EPWM_P1Y,EPWM_StartStopEvent_OutLow,EPWM_PendEvent_OutLow,EPWM_CentralEvent_NoChange,EPWM_EqCMPAEvent_OutHigh,EPWM_EqCMPBEvent_NoChange,1000,500,0);		//P1Y CNTR=1000,CMPAR=500,CMPBR=0
	//EPWM_PX_PY_Configure(EPWM_P2X,EPWM_StartStopEvent_OutHigh,EPWM_PendEvent_OutHigh,EPWM_CentralEvent_NoChange,EPWM_EqCMPAEvent_OutLow,EPWM_EqCMPBEvent_NoChange,1000,500,0);	//P2X CNTR=1000,CMPAR=500,CMPBR=0
	//EPWM_PX_PY_Configure(EPWM_P2Y,EPWM_StartStopEvent_OutLow,EPWM_PendEvent_OutLow,EPWM_CentralEvent_NoChange,EPWM_EqCMPAEvent_OutHigh,EPWM_EqCMPBEvent_NoChange,1000,500,0);		//P2Y CNTR=1000,CMPAR=500,CMPBR=0
	
	EPWM_OUTPUT_Configure(EPWM_PWM_X0OrPWM_Y0,EPWM_OUTSE_PXPYOutputDirect,EPWM_X_POLARITY_NoChange,EPWM_Y_POLARITY_NoChange,EPWM_SRCSEL_PX,0x10,0x10);		//PWM_X PWM_Y 直接输出模式,输出端电平保持不变,RED=EPMW_CLK*16=16us,FED=EPMW_CLK*16=16us								
	EPWM_OUTPUT_Configure(EPWM_PWM_X1OrPWM_Y1,EPWM_OUTSE_PXPYOutputDirect,EPWM_X_POLARITY_NoChange,EPWM_Y_POLARITY_NoChange,EPWM_SRCSEL_PX,0x10,0x10);		//PWM_X PWM_Y 直接输出模式,输出端电平保持不变,RED=EPMW_CLK*16=16us,FED=EPMW_CLK*16=16us						
	EPWM_OUTPUT_Configure(EPWM_PWM_X2OrPWM_Y2,EPWM_OUTSE_PXPYOutputDirect,EPWM_X_POLARITY_NoChange,EPWM_Y_POLARITY_NoChange,EPWM_SRCSEL_PX,0x10,0x10);		//PWM_X PWM_Y 直接输出模式,输出端电平保持不变,RED=EPMW_CLK*16=16us,FED=EPMW_CLK*16=16us	
					
	//EPWM_LKCR_TRG_Configure(CMP0LKM,0x02);														//选择CMP0为外部触发源，正常启动模式
	//EPWM_LKCR_TRG_Configure(CMP1LKM,0x07);														//选择CMP1为外部触发源，硬锁止
	//EPWM_LKCR_TRG_Configure(CMP4LKM,0x03);														//选择CMP4为外部触发源，硬锁止(软锁止)
	
	//EPWM_TrgivtAndTrgtdl_Set_Configure(14,200);													//延时时间：（14+1）*4*1us=64us    间隔时间：200*4*1us=800us
	
	//EPWM_SoftHardWare_OUTPUT_Configure(EPWM_LK_output_HLP0XS,EPWM_LK_output_LOW);					//PWM_X0产生硬锁止时，输出低
	//EPWM_SoftHardWare_OUTPUT_Configure(EPWM_LK_output_SLP0YS,EPWM_LK_output_LOW);					//PWM_Y0产生软锁止时，输出低
	//EPWM_SoftHardWare_OUTPUT_Configure(EPWM_LK_output_SLP1XS,EPWM_LK_output_LOW);					//PWM_X1产生软锁止时，输出低
	//EPWM_SoftHardWare_OUTPUT_Configure(EPWM_LK_output_SLP1YS,EPWM_LK_output_LOW);					//PWM_Y1产生软锁止时，输出低
	//EPWM_SoftHardWare_OUTPUT_Configure(EPWM_LK_output_SLP2XS,EPWM_LK_output_LOW);					//PWM_X2产生软锁止时，输出低
	//EPWM_SoftHardWare_OUTPUT_Configure(EPWM_LK_output_SLP2YS,EPWM_LK_output_LOW);					//PWM_Y2产生软锁止时，输出低

	//EPWM_ConfigInterrupt_CMD(EPWM_START0,ENABLE);				//使能 Count0开启中断
	//EPWM_ConfigInterrupt_CMD(EPWM_STOP0,ENABLE);				//使能 Count0停止中断
	//EPWM_ConfigInterrupt_CMD(EPWM_PEND0,ENABLE);				//使能 Count0周期结束中断
	//EPWM_ConfigInterrupt_CMD(EPWM_CENTER0,ENABLE);			//使能 Count0递增递减或递减递增中间计数中断
	//EPWM_ConfigInterrupt_CMD(EPWM0_CMPAUM,ENABLE);			//使能 Count0递增CMPA匹配中断
	//EPWM_ConfigInterrupt_CMD(EPWM0_CMPADM,ENABLE);			//使能 Count0递减CMPA匹配中断
	//EPWM_ConfigInterrupt_CMD(EPWM0_CMPBUM,ENABLE);			//使能 Count0递增CMPB匹配中断
	//EPWM_ConfigInterrupt_CMD(EPWM0_CMPBDM,ENABLE);			//使能 Count0递减CMPB配置中断
	
	//EPWM_ConfigInterrupt_CMD(EPWM_START1,ENABLE);				//使能 Count1开启中断
	//EPWM_ConfigInterrupt_CMD(EPWM_STOP1,ENABLE);				//使能 Count1停止中断
	//EPWM_ConfigInterrupt_CMD(EPWM_PEND1,ENABLE);				//使能 Count1周期结束中断
	//EPWM_ConfigInterrupt_CMD(EPWM_CENTER1,ENABLE);			//使能 Count1递增递减或递减递增中间计数中断
	//EPWM_ConfigInterrupt_CMD(EPWM1_CMPAUM,ENABLE);			//使能 Count1递增CMPA匹配中断
	//EPWM_ConfigInterrupt_CMD(EPWM1_CMPADM,ENABLE);			//使能 Count1递减CMPA匹配中断
	//EPWM_ConfigInterrupt_CMD(EPWM1_CMPBUM,ENABLE);			//使能 Count1递增CMPB匹配中断	
	//EPWM_ConfigInterrupt_CMD(EPWM1_CMPBDM,ENABLE);			//使能 Count1递减CMPB配置中断
	
	//EPWM_ConfigInterrupt_CMD(EPWM_START2,ENABLE);				//使能 Count2开启中断
	//EPWM_ConfigInterrupt_CMD(EPWM_STOP2,ENABLE);				//使能 Count2停止中断
	//EPWM_ConfigInterrupt_CMD(EPWM_PEND2,ENABLE);				//使能 Count2周期结束中断	
	//EPWM_ConfigInterrupt_CMD(EPWM_CENTER2,ENABLE);			//使能 Count2递增递减或递减递增中间计数中断
	//EPWM_ConfigInterrupt_CMD(EPWM2_CMPAUM,ENABLE);			//使能 Count2递增CMPA匹配中断
	//EPWM_ConfigInterrupt_CMD(EPWM2_CMPADM,ENABLE);			//使能 Count2递减CMPA匹配中断
	//EPWM_ConfigInterrupt_CMD(EPWM2_CMPBUM,ENABLE);			//使能 Count2递增CMPB匹配中断
	//EPWM_ConfigInterrupt_CMD(EPWM2_CMPBDM,ENABLE);			//使能 Count2递减CMPB配置中断
	
	//EPWM_AllConter_START();					//Count0~Count3 同时开启
	EPWM_Conter0_START();						//Count0 开启	
	//EPWM_Conter1_START();						//Count1 开启
	//EPWM_Conter2_START();						//Count2 开启
	
	//EPWM_Int_Enable();						//使能 EPWM 中断向量
	
} 
/*************************************************************/
//I2C MASTER Initial
//EntryParameter:NONE
//ReturnValue:NONE
/*************************************************************/	
void I2C_MASTER_CONFIG(void)
{
    I2C_DeInit();                                           //所有寄存器复位赋值
    I2C_Master_Init(I2C_G0,FAST_MODE,0x040,0x20);           //查询方式参数配置
	//I2C_Master_Init(I2C_G0,FAST_MODE,0x70,0x30);			//INT方式参数配置			
    //I2C_Int_Enable();                                      //I2C中断向量使能
	
}
/*************************************************************/
//I2C SLAVE Initial
//EntryParameter:NONE
//ReturnValue:NONE
/*************************************************************/	
void I2C_SLAVE_CONFIG(void)
{
    I2C_DeInit();                                           //所有寄存器复位赋值
    I2C_Slave_Init(I2C_G2,FAST_MODE,0x4F,0x40,0xAE);        //从机地址=0xae(8bit), 快速模式, sysclock=20M, 通讯速度=sysclock/(0x4f+4)=240K
    I2C_Int_Enable();                                       //I2C中断向量使能
	
} 
/*************************************************************/
//SPI MASTER Initial
//EntryParameter:NONE
//ReturnValue:NONE
/*************************************************************/	
void SPI_MASTER_CONFIG(void)
{
	SPI_DeInit();
	SPI_NSS_IO_Init(1);
	SPI_Master_Init(SPI_G1,SPI_DATA_SIZE_8BIT,SPI_SPO_0,SPI_SPH_0,SPI_LBM_0,SPI_RXIFLSEL_1_8,0,10);
	//选择SPI IO group1; 发送数据大小为8BIT; SCK工作时为高电平; SCK第一个时钟沿捕捉; 串行正常输出; 接收占用1/8 FIFO中断触发断点; FSSPCLKOUT=20M/10=1M
	//SPI_ConfigInterrupt_CMD(SPI_RXIM,ENABLE);				//使能FIFO接收中断
	//SPI_Int_Enable();										//使能SPI中断向量
	
}
/*************************************************************/
//SPI SLAVE Initial
//EntryParameter:NONE
//ReturnValue:NONE
/*************************************************************/	
void SPI_SLAVE_CONFIG(void)
{
	SPI_DeInit();
	SPI_NSS_IO_Init(1);
	SPI_Slave_Init(SPI_G1,SPI_DATA_SIZE_8BIT,SPI_RXIFLSEL_1_8,0,12);			
	//选择SPI IO group1; 发送数据大小为8BIT;接收占用1/8 FIFO中断触发断点 ;FSSPCLKOUT=20M/12=1.6M
	SPI_ConfigInterrupt_CMD(SPI_RXIM,ENABLE);				//使能FIFO接收中断
	SPI_Int_Enable();										//使能SPI中断向量
}
/*************************************************************/
//syscon Functions
//EntryParameter:NONE
//ReturnValue:NONE
/*************************************************************/
void SYSCON_CONFIG(void)
{
//------SYSTEM CLK AND PCLK FUNTION---------------------------/
    SYSCON_RST_VALUE();                                                         //SYSCON所有寄存器复位赋值
	//SYSCON_General_CMD(ENABLE,ENDIS_IDLE_PCLK);								//SLEEP模式下PCLK使能
    SYSCON_General_CMD(ENABLE,ENDIS_ISOSC);                                     //使能/禁止内部副频
    SYSCON_General_CMD(ENABLE,ENDIS_IMOSC);	                                    //使能/禁止内部主频
	SYSCON_General_CMD(DISABLE,ENDIS_EMOSC);	                                //使能/禁止外部晶振
	//SYSON_EMOSC_32k_EN();														//使能 外部晶振外接 32.768K
	SYSCON_IMOSC_SETECTE(IMOSC_SETECTE_20M);									//选择内部主频为20M
    SystemCLK_HCLKDIV_PCLKDIV_Config(SYSCLK_IMOSC,HCLK_DIV_1,PCLK_DIV_1);       //内部主振作为系统时钟，HCLK 1分频，PCLK 1分频
//------------  WDT FUNTION  --------------------------------/
    SYSCON_IWDCNT_Config(IWDT_TIME_1S,IWDT_INTW_DIV_1);     					//WDT溢出时间1s;WDT TEIM:1S*(1-(8-1)/8)=0.75S
    //SYSCON_WDT_CMD(ENABLE);                                                   //禁止WDT功能
    SYSCON_WDT_CMD(DISABLE);
    SYSCON_IWDCNT_Reload();                                                     //清狗
	//SYSCON->IECR|=IWDT_INT_ST;												//使能WDT报警中断
	//SYSCON_WakeUp_Enable();													//使能syscon中断唤醒
//------------  LVD FUNTION  --------------------------------/ 
	LVR_Enable();																//Disable LVR ,上电缺省LVR Enable,
    SYSCON_LVD_Config(ENABLE_LVDEN,INTDET_LVL_2_5V,RSTDET_LVL_2_2V,ENABLE_LVD_INT);	//使能LVD LVR功能, LVD检测电压2.5V, LVR检测电压2.2V, 使能LVD中断
    //LVD_Int_Enable();															//使能LVD中断向量
}
/*********************************************************************************/  
//APT32F172_init                                                                  /
//EntryParameter:NONE                                                             /
//ReturnValue:NONE                                                                /
/*********************************************************************************/
void APT32F172_init(void) 
{
//------------------------------------------------------------/
//Peripheral clock enable and disable
//EntryParameter:NONE
//ReturnValue:NONE
//------------------------------------------------------------/
	SYSCON_WDT_CMD(DISABLE);                                        //禁止 WDT
	SYSCON->PCER0=0xFFFFFFF;                                        //使能IP
    SYSCON->PCER1=0xFFFFFFF;                                        //使能IP
	while(!(SYSCON->PCSR0&0x1));                                    //判断IP是否使能
//------------------------------------------------------------/
//ISOSC/IMOSC/EMOSC/SYSCLK/IWDT/LVD/EM_CMFAIL/EM_CMRCV/CMD_ERR OSC stable interrupt
//EntryParameter:NONE
//ReturnValue:NONE
//------------------------------------------------------------/
	SYSCON_Int_Enable();                                             //使能SYSCON中断向量
	SYSCON->IECR=ISOSC_ST|IMOSC_ST|EMOSC_ST|SYSCLK_ST;               //使能 ISOSC时钟稳定中断,使能IMOSC 时钟稳定中断,使能EMOSC时钟稳定中断
	CK_CPU_EnAllNormalIrq();                                         //打开全局中断
	SYSCON_CONFIG();                                                 //syscon参数 初始化
//------------------------------------------------------------/
//Other IP config
//------------------------------------------------------------/
	//GPIO_CONFIG();													//GPIO 初始化
	//CMP_CONFIG();													 	//CMP 初始化
	//OPAMP_CONFIG();													//OPAMP 初始化
	//ADC_CONFIG();														//ADC 初始化
	//EPWM_CONFIG();													//EPWM 初始化
	//LED_CONFIG();														//LED 初始化
	CORET_CONFIG();														//CORET 初始化 1000ms@20M
	//GPT_CONFIG();														//GPT 初始化
	GTC_CONFIG();														//GTC 初始化  100ms@20M
	STC16_CONFIG();													//STC16 初始化		10ms@20M
	//CTC_CONFIG();														//CTC 初始化
	//I2C_MASTER_CONFIG();                                          	//I2C 作主机 初始化 
    //I2C_SLAVE_CONFIG();                                           	//I2C 作从机 初始化 	
	//SPI_MASTER_CONFIG();												//SPI 作主机 初始化 	
	//SPI_SLAVE_CONFIG();												//SPI 作从机 初始化  
	//UART_CONFIG();													//UART 初始化
	//USART_CONFIG();													//USART 初始化
}		

/******************* (C) COPYRIGHT 2018 APT Chip *****END OF FILE****/
